
class PessoaService {

    static transactional = true

    // Verifica se a UC ou a IE que estão recebendo o convênio ja tem role, se não tiver adiciona.
    public void verificaRole(Pessoa pessoa, String acao) {
        
        if(acao == 'remover'){
            removePessoaRole(pessoa, tipoRole(pessoa));
        }
        if(acao == 'gravar'){
            println("AQUI 16");
            println(possuiRole(pessoa));
            if(!possuiRole(pessoa)){
                println("AQUI 15")
                gravaPessoaRole(pessoa, tipoRole(pessoa));
            }
        }
    }


    /*
     * Método que verifica se a pessoa tem rule.
     */
    private boolean possuiRole(Pessoa pessoa){
        PessoaRole pessoaRole = PessoaRole.findByPessoa(pessoa)
        if(pessoaRole){
            return true;
        }else{
            return false;
        }
    }

    /*
     * Método que vincula a pessoa a role.
     */
    private boolean gravaPessoaRole(Pessoa pessoa, Role role){
        PessoaRole pessoaRole = new PessoaRole();
        pessoaRole.pessoa     = pessoa;
        pessoaRole.role       = role
        if(pessoaRole.save()){
            return true;
        }else{
            return false
        }
    }

    /*
     * Método que grava as roles.
     */
    private boolean removePessoaRole(Pessoa pessoa, Role role){
        PessoaRole pessoaRole = new PessoaRole();
        pessoaRole.pessoa     = pessoa;
        pessoaRole.role       = role
        if(pessoaRole.delete()){
            return true;
        }else{
            return false
        }
    }

    /*
     * Retorna a rule que ele pessoa deveria ter.
     */
    private Role tipoRole(Pessoa pessoa){
        String tipo;
        def pessoaInstance = pessoa;

        if(UnidadeConcedente.findById(pessoa.id)){
            tipo = "ROLE_UC";
        }else if(InstituicaoEnsino.findById(pessoa.id)){
            tipo = "ROLE_IE";
        }else if(Estagiario.findById(pessoa.id)){
            tipo = "ROLE_ESTAGIARIO";
        }
        Role role = Role.findByAuthority(tipo);
        
        return role;
    }
}
